module repository.OfflineRepository;

import hunt.framework;
import hunt.logging;
import std.conv : to;
import bootstrap.DatabaseBootstrap;
import model;
import message.MsgDefine;
import std.base64;

class OfflineRepository : EntityRepository!( Offline , int) {

  this()
  {
    super(defaultEntityManager());
  }


  Offline[] findAllByID(string userId)
  {
    return findAll(new Condition("%s = '%s'" , Field.toId , userId));
  }

  void putOffline(Msg obj)
  {
    scope(exit)
    {
      _manager.close();
    }

    auto m = new Offline;
    m.chatId = obj.chatId;
    m.fromId = obj.fromUserId;
    m.toId = obj.localId;
    m.message = obj.message;
    m.duration = obj.duration;
    m.createTime = obj.msgTime;
    m.type = cast(uint)obj.type;
    m.ossObjectName = obj.ossObjectName;
    m.fileSize = obj.fileSize;
    m.messageId = obj.messageId;
    m.binaryData = cast(string) Base64.encode( cast(ubyte[])obj.binaryBase64 );
    m.backoff = 0;
    insert(m);



    // // auto insert = _manager.createQuery!(Offline)("INSERT INTO Offline u(u.chatId,u.fromId,u.toId,u.message,u.duration,u.createTime,u.type,u.ossObjectName,u.fileSize,u.messageId,u.binaryData) VALUES (?,?,?,?,?,?,?,?,?,?,?)");
    // // insert.setParameter(1,obj.chatId);
    // // insert.setParameter(2,obj.fromUserId);
    // // insert.setParameter(3,obj.localId);
    // // insert.setParameter(4,obj.message);
    // // insert.setParameter(5,obj.duration);
    // // insert.setParameter(6,obj.msgTime);
    // // insert.setParameter(7,cast(uint)obj.type);
    // // insert.setParameter(8,obj.ossObjectName);
    // // insert.setParameter(9,obj.fileSize);
    // // insert.setParameter(10,obj.messageId);
    // // insert.setParameter(11,obj.binaryBase64);
    // // insert.exec();
  }

  void deleteOffline(string userId)
  {
    scope(exit)
    {
      _manager.close();
    }
    auto dele = _manager.createQuery!(Offline)("DELETE from Offline u where u.toId = :toId");
    dele.setParameter("toId",userId);

    try{
      dele.exec();
    }
    catch(Exception e)
    {
      logError("deleteOffline error : %s",e.msg);
    }
  }

  bool backoffOffline(string msgId)
  {
    scope(exit)
    {
      _manager.close();
    }
    

    auto dele = _manager.createQuery!(Offline)("UPDATE Offline SET backoff = :backoff where message_id = :message_id");
    dele.setParameter("message_id",msgId);
    dele.setParameter("backoff",1);

    try{
      dele.exec();
    }
    catch(Exception e)
    {
      logError("backoffOffline error : %s",e.msg);
    }

    return true;
  }
}

